package hos.kotlin

/**
 * <p>Title: AirUtils </p>
 * <p>Description:  </p>
 * <p>Company: www.mapuni.com </p>
 *
 * @author : 蔡俊峰
 * @date : 2024-07-23 20:09
 * @version : 1.0
 */
object AirUtils {
    @JvmStatic
    fun pm25(): String {
        return "PM₂.₅"
    }

    @JvmStatic
    fun pm10(): String {
        return "PM₁₀"
    }

    @JvmStatic
    fun o3(): String {
        return "O₃"
    }

    @JvmStatic
    fun no2(): String {
        return "NO₂"
    }

    @JvmStatic
    fun so2(): String {
        return "SO₂"
    }

    /**
     * 返回单位“μg/m³”的字符串表示
     *
     * @returns 字符串，表示单位“μg/m³”
     */
    @JvmStatic
    fun unitug(): String {
        return "μg/m³";
    }

    /**
     * 返回单位 "mg/m³"
     *
     * @returns 返回字符串 "mg/m³"
     */
    @JvmStatic
    fun unitmg(): String {
        return "mg/m³";
    }

    @JvmStatic
    fun pm25Html(): String {
        return "PM<sub><small><small>2.5</small></small></sub>"
    }

    @JvmStatic
    fun pm10Html(): String {
        return "PM<sub><small><small>10</small></small></sub>"
    }

    @JvmStatic
    fun o3Html(): String {
        return "O<sub><small><small>3</small></small></sub>"
    }

    @JvmStatic
    fun vocsHtml(): String {
        return "VOC<sub><small><small>s</small></small></sub>"
    }

    @JvmStatic
    fun nh3Html(): String {
        return "NH<sub><small><small>3</small></small></sub>"
    }

    @JvmStatic
    fun noxHtml(): String {
        return "NO<sub><small><small>x</small></small></sub>"
    }

    @JvmStatic
    fun no2Html(): String {
        return "NO<sub><small><small>2</small></small></sub>"
    }

    @JvmStatic
    fun so2Html(): String {
        return "SO<sub><small><small>2</small></small></sub>"
    }

    /**
     * 处理监测因子
     *
     * @param factor
     * @return
     */
    @JvmStatic
    fun replaceHtml(factor: String?): String {
        if (factor == null || factor.isNull()) {
            return "--"
        }
        return factor.replace("null".toRegex(), "--").replace("无".toRegex(), "--")
            .replace("PM25".toRegex(), pm25Html())
            .replace("PM2.5".toRegex(), pm25Html())
            .replace("PM₂.₅".toRegex(), pm25Html())
            .replace("pm25".toRegex(), pm25Html())
            .replace("PM10".toRegex(), pm10Html())
            .replace("pm10".toRegex(), pm10Html())
            .replace("PM₁₀".toRegex(), pm10Html())
            .replace("O31H".toRegex(), o3Html())
            .replace("O31".toRegex(), o3Html())
            .replace("O3-1H".toRegex(), o3Html())
            .replace("O3-1".toRegex(), o3Html())
            .replace("O38H".toRegex(), "O<sub><small><small>3</small></small></sub>_8h")
            .replace("O38".toRegex(), "O<sub><small><small>3</small></small></sub>_8h")
            .replace("O3-8".toRegex(), "O<sub><small><small>3</small></small></sub>_8h")
            .replace("O38".toRegex(), "O<sub><small><small>3</small></small></sub>_8h")
            .replace("O3".toRegex(), o3Html())
            .replace("o3".toRegex(), o3Html())
            .replace("O₃".toRegex(), o3Html())
            .replace("VOCS".toRegex(), "VOC<sub><small><small>s</small></small></sub>")
            .replace("NH3".toRegex(), "NH<sub><small><small>3</small></small></sub>")
            .replace("NOX".toRegex(), "NO<sub><small><small>x</small></small></sub>")
            .replace("NO2".toRegex(), no2Html())
            .replace("no2".toRegex(), no2Html())
            .replace("NO₂".toRegex(), no2Html())
            .replace("SO2".toRegex(), so2Html())
            .replace("so2".toRegex(), so2Html())
            .replace("SO₂".toRegex(), so2Html())
    }

    @JvmStatic
    fun replace(factor: String?): String {
        if (factor == null || factor.isNull()) {
            return ""
        }
        return factor.replace("--".toRegex(), "")
            .replace("-".toRegex(), "")
            .replace("PM2.5".toRegex(), "PM25")
            .replace("PM<sub><small><small>2.5</small></small></sub>".toRegex(), "PM25")
            .replace(" PM<sub><small><small>2.5</small></small></sub>".toRegex(), "PM25")
            .replace(" PM<sub><small><small>25</small></small></sub>".toRegex(), "PM25")
            .replace("PM<sub><small><small>10</small></small></sub>".toRegex(), "PM10")
            .replace("PM₂.₅".toRegex(), "PM25")
            .replace("PM₁₀".toRegex(), "PM10")
            .replace("O₃".toRegex(), "O3")
            .replace("SO₂".toRegex(), "SO2")
            .replace("NO₂".toRegex(), "NO2")
            .replace("pm25".toRegex(), "PM25")
            .replace("pm10".toRegex(), "PM10")
            .replace("tsp".toRegex(), "TSP")
            .replace("so2".toRegex(), "SO2")
            .replace("no2".toRegex(), "NO2")
            .replace("co".toRegex(), "CO")
            .replace("o3".toRegex(), "O3")
            .replace("aqi".toRegex(), "AQI")
            .replace("O<sub><small><small>3</small></small></sub>".toRegex(), "O3")
            .replace("O<sub><small><small>3</small></small></sub>_8h".toRegex(), "O38H")
            .replace("VOC<sub><small><small>s</small></small></sub>".toRegex(), "VOCS")
            .replace("NH<sub><small><small>3</small></small></sub>".toRegex(), "NH3")
            .replace("NO<sub><small><small>x</small></small></sub>".toRegex(), "NOX")
            .replace("NO<sub><small><small>2</small></small></sub>".toRegex(), "NO2")
            .replace("SO<sub><small><small>2</small></small></sub>".toRegex(), "SO2")
    }


    /**
     * 获取空气质量 AQI 的等级
     *
     * @param value 空气质量的数据
     * @return 等级
     */
    @JvmStatic
    fun getAQILevel(value: Int): Int {
        if (value in 0..50) {
            return 1
        } else if (value in 51..100) {
            return 2
        } else if (value in 101..150) {
            return 3
        } else if (value in 151..200) {
            return 4
        } else if (value in 201..300) {
            return 5
        } else if (value > 300) {
            return 6
        }
        return 7
    }


    /**
     * 获取空气质量 PM25 的等级
     *
     * @param value 空气质量的数据
     * @return 等级
     */
    @JvmStatic
    fun getPM25Level(value: Double): Int {
        if (value > 0 && value <= 35) {
            return 1
        } else if (value > 35 && value <= 75) {
            return 2
        } else if (value > 75 && value <= 115) {
            return 3
        } else if (value > 115 && value <= 150) {
            return 4
        } else if (value > 150 && value <= 250) {
            return 5
        } else if (value > 250) {
            return 6
        }
        return 7
    }

    /**
     * 获取空气质量 PM10 的等级
     *
     * @param value 空气质量的数据
     * @return 等级
     */
    @JvmStatic
    fun getPM10Level(value: Double): Int {
        if (value > 0 && value <= 50) {
            return 1
        } else if (value > 50 && value <= 150) {
            return 2
        } else if (value > 150 && value <= 250) {
            return 3
        } else if (value > 250 && value <= 350) {
            return 4
        } else if (value > 350 && value <= 420) {
            return 5
        } else if (value > 420) {
            return 6
        }
        return 7
    }

    /**
     * 获取空气质量 SO2 的等级
     *
     * @param value 空气质量的数据
     * @return 等级
     */
    @JvmStatic
    fun getSO2Level(value: Double): Int {
        if (value > 0 && value <= 150) {
            return 1
        } else if (value > 150 && value <= 500) {
            return 2
        } else if (value > 500 && value <= 650) {
            return 3
        } else if (value == -1.0) {
            return 4
        } else if (value > 650) {
            return 5
        }
        return 7
    }

    /**
     * 获取空气质量 NO2 的等级
     *
     * @param value 空气质量的数据
     * @return 等级
     */
    @JvmStatic
    fun getNO2Level(value: Double): Int {
        if (value > 0 && value <= 100) {
            return 1
        } else if (value > 100 && value <= 200) {
            return 2
        } else if (value > 200 && value <= 700) {
            return 3
        } else if (value > 700 && value <= 1200) {
            return 4
        } else if (value > 1200 && value <= 2340) {
            return 5
        } else if (value > 2340) {
            return 6
        }
        return 7
    }

    /**
     * 获取空气质量 CO 的等级
     *
     * @param value 空气质量的数据
     * @return 等级
     */
    @JvmStatic
    fun getCOLevel(value: Double): Int {
        if (value > 0 && value <= 5) {
            return 1
        } else if (value > 5 && value <= 10) {
            return 2
        } else if (value > 10 && value <= 35) {
            return 3
        } else if (value > 35 && value <= 60) {
            return 4
        } else if (value > 60 && value <= 90) {
            return 5
        } else if (value > 90) {
            return 6
        }
        return 7
    }

    /**
     * 获取空气质量 O3One 的等级 1小时
     *
     * @param value 空气质量的数据
     * @return 等级
     */
    @JvmStatic
    fun getO3OneLevel(value: Double): Int {
        if (value > 0 && value <= 160) {
            return 1
        } else if (value > 160 && value <= 200) {
            return 2
        } else if (value > 200 && value <= 300) {
            return 3
        } else if (value > 300 && value <= 400) {
            return 4
        } else if (value > 400 && value <= 800) {
            return 5
        } else if (value > 800) {
            return 6
        }
        return 7
    }

    /**
     * 获取空气质量 O3Eight 的等级 8小时
     *
     * @param value 空气质量的数据
     * @return 等级
     */
    @JvmStatic
    fun getO3EightLevel(value: Double): Int {
        if (value > 0 && value <= 100) {
            return 1
        } else if (value > 100 && value <= 160) {
            return 2
        } else if (value > 160 && value <= 215) {
            return 3
        } else if (value > 215 && value <= 265) {
            return 4
        } else if (value > 265) {
            return 5
        } else if (value == -2.0) {
            return 6
        }
        return 7
    }

    //</editor-fold>
    /**
     * 根据等级或空气质量的背景
     *
     * @param level 等级
     * @return 资源ID
     */
    @JvmStatic
    fun getColor(level: Int?): String {
        if (level == null) {
            return "#B5B5B5"
        }
        when (level) {
            1 -> {
                return "#39b711"
            }

            2 -> {
                return "#fed034"
            }

            3 -> {
                return "#ff7e00"
            }

            4 -> {
                return "#fc0d1b"
            }

            5 -> {
                return "#97084c"
            }

            6 -> {
                return "#500017"
            }

            7 -> {
                return "#39b711"
            }

            else -> return "#B5B5B5"
        }
    }

    /**
     * 获取文本颜色
     *
     * @param value 数值，用于判断文本颜色
     * @param target 目标值，用于与value进行比较
     * @returns 返回文本颜色值，若value大于target则返回'#FFFFFF'，否则返回'#000000'
     */
    @JvmStatic
    fun getTextColor(value: Double?, target: Double): String {
        if (value == null) {
            return "#000000"
        }
        return if (value > target) {
            "#FFFFFF"
        } else {
            "#000000"
        }
    }

    @JvmStatic
    fun getTextLevel(level: Int?): String {
        if (level == null) {
            return "--"
        }
        when (level) {
            1 -> {
                return "优"
            }

            2 -> {
                return "良"
            }

            3 -> {
                return "轻度"
            }

            4 -> {
                return "中度"
            }

            5 -> {
                return "重度"
            }

            6 -> {
                return "严重"
            }

            else -> return "--"
        }
    }

    /**
     * 获取空气质量指数(AQI)的文本颜色
     *
     * @param aqi 空气质量指数(AQI)
     * @returns 返回文本颜色值
     */
    @JvmStatic
    fun getAqiTextColor(aqi: Int?): String {
        return getTextColor(aqi?.toDouble(), 150.0)
    }

    @JvmStatic
    fun getAqiTextLevel(value: Int?): String {
        if (value == null) {
            return "--"
        }
        return getTextLevel(getAQILevel(value))
    }

    /**
     * 根据空气质量指数（AQI）获取背景颜色
     *
     * @param aqi 空气质量指数（AQI），默认为0
     * @returns 返回与AQI等级对应的背景颜色
     */
    @JvmStatic
    fun getAqiBackgroundColor(aqi: Int?): String {
        if (aqi == null) {
            return getColor(null)
        }
        return getColor(getAQILevel(aqi))
    }

    /**
     * 获取PM10文本颜色
     *
     * @param pm10 PM10浓度值，需为数字或字符串形式
     * @returns 返回对应PM10浓度的文本颜色
     */
    @JvmStatic
    fun getPM10TextColor(pm10: Int?): String {
        return getTextColor(pm10?.toDouble(), 250.0)
    }

    /**
     * 根据PM10值获取背景颜色
     *
     * @param pm10 PM10值，类型为字符串或数字，若为空则默认为0.0
     * @returns 返回对应的背景颜色
     */
    @JvmStatic
    fun getPM10BackgroundColor(pm10: Int?): String {
        if (pm10 == null) {
            return getColor(null)
        }
        return getColor(getPM10Level(pm10.toDouble()));
    }

    /**
     * 获取PM2.5文本颜色
     *
     * @param pm25 PM25数值，作为计算PM2.5文本颜色的依据
     * @returns 返回PM2.5文本颜色对应的字符串
     */
    @JvmStatic
    fun getPM25TextColor(pm25: Int?): String {

        return getTextColor(pm25?.toDouble(), 115.0)
    }

    /**
     * 获取 PM2.5 背景颜色
     *
     * @param pm10 PM10 值，若未传入或传入非数字则默认为 0.0
     * @returns 返回对应的 PM2.5 背景颜色
     */
    @JvmStatic
    fun getPM25BackgroundColor(pm25: Int?): String {
        if (pm25 == null) {
            return getColor(null)
        }
        return getColor(getPM25Level(pm25.toDouble()));
    }

    /**
     * 根据 PM10 值获取 SO2 的文本颜色
     *
     * @param so2 PM10 数值
     * @returns 返回 SO2 的文本颜色
     */
    @JvmStatic
    fun getSO2TextColor(so2: Int?): String {
        return getTextColor(so2?.toDouble(), 475.0)
    }

    @JvmStatic
    fun getSO2BackgroundColor(so2: Int?): String {
        if (so2 == null) {
            return getColor(null)
        }
        return getColor(getSO2Level(so2.toDouble()));
    }

    @JvmStatic
    fun getNO2TextColor(no2: Int?): String {
        return getTextColor(no2?.toDouble(), 180.0)
    }

    @JvmStatic
    fun getNO2BackgroundColor(no2: Int?): String {
        if (no2 == null) {
            return getColor(null)
        }
        return getColor(getNO2Level(no2.toDouble()));
    }

    @JvmStatic
    fun getCOTextColor(co: Double?): String {
        return getTextColor(co, 35.0)
    }

    @JvmStatic
    fun getCOBackgroundColor(co: Double?): String {
        if (co == null) {
            return getColor(null)
        }
        return getColor(getCOLevel(co));
    }

    @JvmStatic
    fun getO3TextColor(o3: Int?): String {
        return getTextColor(o3?.toDouble(), 300.0)
    }

    @JvmStatic
    fun getO3BackgroundColor(o3: Int?): String {
        if (o3 == null) {
            return getColor(null)
        }
        return getColor(getO3OneLevel(o3.toDouble()));
    }
}